過度擬合就是模型在訓練資料上表現得很好,但在沒看過的測試資料上效果卻很差。
為甚麼要提前停止? 在模型訓練過程中,我們會同時觀察訓練資料和驗證資料的表現。一開始,兩者的誤差都會隨著訓練而減少。但當模型開始過度擬合時,你會發現訓練資料的誤差持續下降,但驗證資料的誤差卻開始上升。
這個時候,就應該停止訓練了。
提前停止 的目的就是,在模型即將要過度擬合時,及時喊停,而不是讓它繼續學下去。這樣可以確保模型在新的資料上也能保持良好的泛化能力,也就是說,它學會的是通用的規律,而不是訓練資料中的特例。
這次有修改一些,課本的程式不能用
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras import metrics
from tensorflow.keras.callbacks import EarlyStopping
# 匯入Keras 的 mnist 樹據
from tensorflow.keras.datasets import mnist
(train_Data, train_label), (test_Data, test_label) = mnist.load_data()
model = Sequential([
layers.Flatten(input_shape=(28, 28)), # 將輸入資料從 28x28 攤平成 784
layers.Dense(256, activation='relu'),
layers.Dense(128, activation='relu'),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax') # output 為 10 個 class
])
# 定義訓練的步驟數目
NUM_EPOCHS = 100
# model 每層定義好後需要經過 compile
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc',
metrics.sparse_top_k_categorical_accuracy])
# 定義 tf.keras.EarlyStopping 回調函數
# 並指名監控的對象 => val_sparse_top_k_categorical_accuracy
earlystop_callback = EarlyStopping(
monitor='val_sparse_top_k_categorical_accuracy',
min_delta=0.001,
patience=1,
verbose=1,
mode='max' # 新增這行,明確指定監控模式
)
# 將建立好的 model 去 fit 我們 training data
model.fit(train_Data, train_label,validation_split = 0.2,epochs=NUM_EPOCHS,callbacks=[earlystop_callback,])
# 利用 test_Data 去進行模型評估
# verbose = 2 為每個 epoch 輸出一行紀錄
model.evaluate(test_Data, test_label, verbose=2)